﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// Объявление переменной в функции
    /// </summary>
    public class FunctionVarDeclarationElement : SyntaxTreeElement, ISectionElementElement
    {
        protected List<IdElement> ids;
        protected ITypeElement type;
        protected ISyntaxTreeElement value;
        protected bool isplatform;

        /// <summary>
        /// Идентификаторы
        /// </summary>
        public List<IdElement> Ids { get { return ids; } set { ids = value; } }

        /// <summary>
        /// Тип
        /// </summary>
        public ITypeElement Type { get { return type; } set { type = value; } }

        /// <summary>
        /// Наличие директивы platform
        /// </summary>
        public bool IsPlatform { get { return isplatform; } set { isplatform = value; } }

        /// <summary>
        /// Значение
        /// </summary>
        public ISyntaxTreeElement Value { get { return this.value; } set { this.value = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="StartInfo">информация о позиции элемента в коде</param>
        /// <param name="Ids">иентификаторы</param>
        /// <param name="Type">тип</param>
        /// <param name="IsPlatform">наличие директивы platform</param>
        /// <param name="Value">значение</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public FunctionVarDeclarationElement(TokenInfo StartInfo, List<IdElement> Ids, ITypeElement Type, bool IsPlatform, ISyntaxTreeElement Value, List<TokenInfo> Comments)
            : base(StartInfo, Comments)
        {
            ids = Ids;
            type = Type;
            isplatform = IsPlatform;
            value = Value;
        }

        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            return string.Format("{0}{1}{2}", ids.Join(", "),
                (type != null) ? string.Format(" : {0}", type) : string.Empty,
                (value != null) ? string.Format(" = {0}", value) : string.Empty);
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            foreach (IdElement id in ids)
                yield return id;
            if (type != null)
                yield return type;
            if (value != null)
                yield return value;
        }
    }
}
